package basic.basic_class03;

/**
 * “之”字形打印矩阵
 *
 * 【题目】 给定一个矩阵matrix，按照“之”字形的方式打印这
 * 个矩阵，例如： 1 2 3 4
 *              5 6 7 8
 *              9 10 11 12
 * “之”字形打印的结果为：1，2，5，9，6，3，4，7，10，11，8，12
 * 【要求】 额外空间复杂度为O(1)。
 *
 *
 * 初始化A，B两个遍历点，A从左上角向右移动，碰到边界则向下移动；B从左上角开始向下移动，如果碰到边界，则向右移动；每次更新A，B点后，都遍历A到B或者B到A上所经过的所有点。
 */
public class Code_08_ZigZagPrintMatrix {

    public static void printMatrixZigZag (int[][] matrix) {
        int aR = 0;
        int aC = 0;
        int bR = 0;
        int bC = 0;
        int row = matrix.length;
        int col = matrix[0].length;
        boolean direction = false;
        while(aR != matrix.length) {
            printLine(matrix,aR,aC,bR,bC,direction);
            aR = aC == col - 1 ? aR + 1 : aR;
            aC = aC == col - 1 ? aC : aC + 1;
            bC = bR == row - 1 ? bC + 1 : bC;  // 注意一定要先调整列的位置
            bR = bR == row - 1 ? bR : bR + 1;
            direction = !direction;
        }
    }

    private static void printLine(int[][] matrix, int aR, int aC, int bR, int bC, boolean direction) {
        if(direction){
            while(aR != bR + 1) {
                System.out.println(matrix[aR++][aC--] + " ");
            }
        }else{
            while(bR != aR - 1) {
                System.out.println(matrix[bR--][bC++] + " ");
            }
        }
    }

    public static void main(String[] args) {
        int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
        printMatrixZigZag(matrix);
    }
}
